import store from '../store/index'
import Message from '@ele/component/Message'
import { msgBox } from '@/utils/msgBox'
import urlVersions from './urlVersions'
import { isEmpty } from '@/utils'

// 域名池
const baseURLPool = [
  'http://192.168.2.21:8082/',
  'http://47.99.171.118:8084/',
  'http://v2-h.xgwl.net.cn/',
  'http://v2.h.com/'
]

// 基本链接
const baseURL = baseURLPool[0]
// 全局版本号
const version = 'v1000'
// 请求方式
const method = 'GET'

// 链接版本控制器
function urlVersionHandle(url, urlVersions) {
  for (let key of Object.keys(urlVersions)) {
    const urlList = urlVersions[key]
    if (urlList.indexOf(url) !== -1) {
      // return url.replace(/(.+)\/(.+)$/g, '$1/' + key + '_$2')
      return url + `_${key}`
    } else {
      // return url.replace(/(.+)\/(.+)$/g, '$1/' + version + '_$2')
      return url + `_${version}`
    }
  }
}

// 验证状态
function validateStatus(status) {
  return status >= 200 && status < 300
}

// 剔除空值
function delNullValue(obj) {
  Object.keys(obj).forEach((e) => {
    if (isEmpty(obj[e])) delete obj[e]
  })
}

function result(fullUrl, config, callback) {
  // 开始请求
  return new Promise((resolve, reject) => {
    fetch(fullUrl, config)
      .then((response) => {
        if (!validateStatus(response.status))
          return reject(new Error('错误的状态码：' + response.status))
        response.json().then((data) => {
          // let error;
          if (data.code === 200) {
            callback && callback(data)
            return resolve(data)
          }

          // 未登录
          if (data.code === 401) {
            msgBox.dialog('请登录后重试', {
              type: 'warning',
              beforeClose: (action, instance, done) => {
                store.dispatch('user/logout').then(done)
              }
            })
            return reject()
          }

          // 其他错误
          const message =
            (data.data && data.data.replace(/^.*?:(.*)$/g, '$1')) || '请求错误'
          // error = new Error(message);
          Message.error(message)
          return reject(new Error(message))
        })
      })
      .catch((error) => {
        // error && Message.error(error.message);
        reject(error)
      })
  })
}

/**
 * 请求
 * @param {string} url 请求链接
 * @param {Object} data 传参
 * @param {Function} func 回调函数
 * @param {Object} setting 一些设置
 * @param {Boolean} setting.isDelNull 是否剔除空值
 */
export function request(url, data, callback, setting = { isDelNull: false }) {
  // 执行剔除空值
  if (setting.isDelNull) delNullValue(data)
  // 定义配置和完整链接
  let config = {
      method
    },
    fullUrl = baseURL + urlVersionHandle(url, urlVersions)

  // 设置 token
  data.token || (data.token = store.state.user.token)

  // 根据请求方式选择传参方式
  method === 'POST' && (config.body = JSON.stringify(data))
  method === 'GET' && (fullUrl += '?' + new URLSearchParams(data).toString())

  // 开始请求
  return result(fullUrl, config, callback)
}

/**
 * 请求
 * @param {string} url 请求链接
 * @param {File} file 文件
 * @param {Function} func 回调函数
 */
export function fileUpload(url, file, otherParame, callback) {
  // 定义配置和完整链接
  let config = {
      method: 'POST',
      header: {
        'Content-Type': 'multipart/form-data'
      }
    },
    fullUrl = baseURL + urlVersionHandle(url, urlVersions),
    fd = new FormData()

  fd.append('file', file)
  fd.append('token', store.state.user.token)

  Object.keys(otherParame).forEach((key) => {
    fd.append(key, otherParame[key])
  })

  config.body = fd

  // 开始请求
  return result(fullUrl, config, callback)
}
